package com.colabo.j2ee.web.oaf.orgnization;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.colabo.j2ee.web.core.exception.CommonException;
import com.colabo.j2ee.web.core.exception.ServiceException;
import com.colabo.j2ee.web.oaf.orgnization.model.IPDutyVO;
import com.colabo.j2ee.web.oaf.orgnization.model.IPPositionVO;
import com.colabo.j2ee.web.oaf.orgnization.model.SCUserProfileVO;
import com.colabo.j2ee.web.oaf.orgnization.model.SCUnitProfileVO;


/**
 * 此接口提供了取得职位数据的各种方法
 */
public interface IPositionService {
	public String BEAN_ID = "positionService";

	public IPPositionVO getPositionByPositionId(String positionid) throws ServiceException;

	/**
	 * 取单位直属职位
	 * 
	 * @param unit
	 * @return
	 * @throws ServiceException
	 */
	List getPositionsByUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 取得单位直属员工, 带分页功能
	 * 
	 * @param unit
	 * @param offset
	 * @param pageSize
	 * @return List<IPPositionVO>
	 * @throws ServiceException
	 */
	List getPositionsByUnit(SCUnitProfileVO unit, int offset, int pageSize) throws ServiceException;

	/**
	 * 单位直属员工总数
	 * 
	 * @param unit
	 * @return 单位直属员工总数
	 * @throws ServiceException
	 */
	int getPositionCountByUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 取当前单位所属机构相关职位, 包括下属部门职位, 一般用于机构定岗
	 * 
	 * @param unit
	 * @param offset
	 * @param pageSize
	 * @return List<IPPositionVO>
	 * @throws ServiceException
	 */
	List getPositionsByOwnerUnit(SCUnitProfileVO unit, int offset, int pageSize) throws ServiceException;

	List getPositionsByOwnerUnit(SCUnitProfileVO unit) throws ServiceException;

	int getPositionCountByOwnerUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 取单位下职位列表, 并根据staff定岗信息设置IPPositionVO的ext1属性(若staff在这个职位有定岗, 则ext1=1,
	 * 否则ext1=0) 这个方法用于在定岗页面中通过checkList选择岗位时, 自动勾选staff拥有的职位
	 * 
	 * @param unit
	 * @param staff
	 * @param offset
	 * @param pageSize
	 * @return List<IPPositionVO>
	 * @throws ServiceException
	 */
	List getPositionsByUnitSelectByStaff(SCUnitProfileVO unit, SCUserProfileVO staff, int offset, int pageSize)
			throws ServiceException;

	int getPositionCountByUnitSelectByStaff(SCUnitProfileVO unit, SCUserProfileVO staff) throws ServiceException;

	/**
	 * 取人员所属岗位
	 * 
	 * @param staff
	 * @return List<IPPositionVO>
	 * @throws ServiceException
	 */
	List getPositionsByStaff(SCUserProfileVO staff) throws ServiceException;
	
	/**
	 * 取人员所属角色
	 * 
	 * @param staff
	 * @return List<IPPositionVO>
	 * @throws ServiceException
	 */
	public List getRolesByStaff(SCUserProfileVO staff) throws ServiceException;

	List getPositionsByStaff(SCUserProfileVO staff, SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 保存职位, 并将保存后的对象返回, 返回对象中加入了生成的主键
	 * 
	 * @param position
	 * @return
	 * @throws ServiceException
	 */
	String save(IPPositionVO position) throws ServiceException;

	/**
	 * 保存岗位
	 * 
	 * @param dutyVo
	 * @return
	 * @throws ServiceException
	 */
	IPDutyVO save(IPDutyVO dutyVo) throws ServiceException;

	/**
	 * 保存默认职位, 新建机构时调用这个方法为新建的机构增加默认职位
	 * 
	 * @param unit
	 * @return
	 * @throws ServiceException
	 */
	IPPositionVO saveDefaultPosition(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 更新职位
	 * 
	 * @param position
	 * @return
	 * @throws ServiceException
	 */
	IPPositionVO update(IPPositionVO position) throws ServiceException;

	int delete(IPPositionVO position) throws ServiceException;

	/**
	 * 批量保存默认岗位.将人员加到机构时为这些人员自动加上默认岗位.
	 * 
	 * @param staffs
	 * @param units
	 * @throws ServiceException
	 */
	void saveDefaultDuty(List staffs, List units) throws ServiceException;

	/**
	 * 取得机构的默认岗位, 若不存在默认岗位则返回null
	 * 
	 * @param unit
	 * @return
	 * @throws ServiceException
	 */
	IPPositionVO getDefaultPosition(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 根据岗位批量保存定岗
	 * 
	 * @param position
	 * @param insertList
	 *            List<SCUserProfileVO>
	 * @param deleteList
	 *            List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	void batchCommitDuty(IPPositionVO position, List insertList, List deleteList) throws ServiceException;

	/**
	 * 根据人员批量保存定岗
	 * 
	 * @param staff
	 * @param insertList
	 *            List<IPPositionVO>
	 * @param deleteList
	 *            List<IPPositionVO>
	 * @throws ServiceException
	 */
	void batchCommitDuty(SCUserProfileVO staff, List insertList, List deleteList) throws ServiceException;
	
	/**
	 * 根据条件查询岗位数据, map中key值为IPPositionVO中属性名称, 值为需要查询的值, 编码通过等于连接, 多个条件通过and连接
	 * 支持查询以下字段: unitid,positionid,positionName 
	 * 
	 * 
	 * 
	 * @param params
	 * @param offset
	 * @param pageSize
	 * @return List<IPPositionVO>
	 * @throws ServiceException
	 */
	List query(Map params, int offset, int pageSize) throws ServiceException;

	/**
	 * 查询结果返回的记录总数, 若查询结果需要分类, 通过这个方法得到查询总人数
	 * 
	 * @param params
	 * @return 查询结果总数
	 * @throws ServiceException
	 */
	int queryCount(Map params) throws ServiceException;
	
	/**
	 * 根据应用判断是否存在岗位
	 * @param unitcode
	 * @return
	 */
	public boolean isExist(String positioncode) throws ServiceException;
	
	/**
	 * 获得系统功用岗位
	 * @return
	 * @throws ServiceException
	 */
	List getPublicPosition() throws ServiceException;
	
	/**
	 * 是否具有超级用户岗位
	 * @param staffid
	 * @return
	 * @throws ServiceException
	 */
	public boolean isHasAdminPosition(String staffid) throws ServiceException;
	/**
	 * 获取全部岗位列表
	 * @return
	 * @throws ServiceException
	 */
	public List getAllPositions()throws ServiceException;
	/**
	 * 获取全部未删除的岗位列表
	 * @return
	 * @throws ServiceException
	 */
	public List getAllUndeletedPositions()throws ServiceException;
	/**
	 * 
	 * @param map
	 * @return
	 */
	public List queryUnit(HashMap map)throws ServiceException;
	/**
	 * 获取岗位表中的所有角色
	 * @return
	 */
	public List getAllPositionsByRole()throws ServiceException; 
	/**
	 * 
	 * @param map
	 * @return
	 */
	public List queryUnitByRole(HashMap map)throws ServiceException;
	
	/**
	 * 获得已删除的岗位列表
	 * @param map
	 * @param offset
	 * @param pageSize
	 * @return
	 * @throws ServiceException
	 */
	public List getBackPositions(HashMap map, int offset, int pageSize) throws ServiceException ;
	
	/**
	 * 获得已删除的岗位个数
	 * @param map
	 * @param offset
	 * @param pageSize
	 * @return
	 * @throws ServiceException
	 */
	public int getBackPositionsCount(HashMap map) throws ServiceException;
	
	/**
	 * 批量还原岗位
	 * @param backBeans 待还原的岗位列表
	 * @return
	 * @throws ServiceException
	 * @throws CommonException
	 */
	public String saveBackToPosition(List backBeans) throws ServiceException ,CommonException;
	
	/**
	 * 批量删除岗位，这里的删除是物理删除，删除后，数据库中不再存在数据
	 * @param delBeans 待删除的岗位列表
	 * @return
	 * @throws ServiceException
	 * @throws CommonException
	 */
	public String saveFullDel(List delBeans) throws ServiceException ,CommonException;
}
